/**
 * 
 */
package com.nari.heatshare.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.nari.heatshare.model.IAssignMeterDataFile;
import com.nari.heatshare.model.IAssignMeterDataGather;
import com.nari.platform.date.CalendarUtils;

/**
 * 分配表数据的TXT格式解析
 * @author Xiaopeng
 * @date 2013-10-28
 */
public class MeterDataTxtParser {
	//分配表数据去重处理，键值对规则：分配表号-上传时间:分配表数据
	private static Map<String, IAssignMeterDataGather> meterDataMap = new HashMap<String, IAssignMeterDataGather>(0);
	
	/**
	 * 根据分配表数据TXT格式文件解析分配表数据
	 * @param dataFile
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-28
	 */
	public synchronized static List<IAssignMeterDataGather> parseTxtMeterData(IAssignMeterDataFile 
			dataFile) throws Exception {
		//去重处理初始化
		meterDataMap.clear();
		//TXT数据文件解析
		if(dataFile != null) {
			String savePath = dataFile.getDiskID() + "/" +dataFile.getSaveUrl();
			File parserFile = new File(savePath);
			if(parserFile.exists() && parserFile.isFile()) {
				InputStreamReader isr = new InputStreamReader(new FileInputStream(parserFile));
				BufferedReader br = new BufferedReader(isr);
				String lineTxt = "";
				while((lineTxt = br.readLine()) != null) {
					IAssignMeterDataGather meterData = parseReadLineTxt(lineTxt);
					if(meterData != null) {
						//设置关联的数据文件
						meterData.setDataFileID(dataFile.getId());
						//数据类型
						meterData.setDataType(1);
					}
				}
				isr.close();
				br.close();
			}
		}
		//TXT解析的分配表数据
		List<IAssignMeterDataGather> meterDataList = new ArrayList<IAssignMeterDataGather>();
		for(Iterator<Entry<String, IAssignMeterDataGather>> it=meterDataMap.entrySet().iterator(); it.hasNext();) {
			meterDataList.add(it.next().getValue());
		}
		return meterDataList;
	}
	
	/**
	 * 将读取的抄表文件行数据解析为分配表数据
	 * 格式：[0]集中器号,[1]热表号,[2]当前热量,[3]上传时间,[4]背板温度,
	 *       [5]空气温度,[6]去年热量,[7]1月份热量,[8]2月份热量,[9]3月份热量,
	 *       [10]4月份热量,[11]5月份热量,[12]10月份热量,[13]11月份热量,[14]12月份热量,
	 *       [15]抄收时间
	 * @param lineTxt
	 * @return
	 * @author Xiaopeng
	 * @date 2013-10-28
	 */
	private static IAssignMeterDataGather parseReadLineTxt(String lineTxt) throws Exception {
		if(lineTxt!=null && lineTxt.length()>0) {
			String[] dataArray = lineTxt.split("[,]");
			if(dataArray.length >= 16) {
				//集中器号
				String concentratorNo = dataArray[0];
				//分配表号
				String seriousNum = concentratorNo + dataArray[1];
				//当前热量，读数
				double readNum = new BigDecimal(dataArray[2]).doubleValue();
				//上传时间
				String readTimeStr = dataArray[3];
				//去重处理
				String avoidRepeatKey = seriousNum + "-" + readTimeStr;
				IAssignMeterDataGather meterData = meterDataMap.get(avoidRepeatKey);
				if(meterData == null) {
					meterData = new IAssignMeterDataGather();
					//去重设置
					meterDataMap.put(avoidRepeatKey, meterData);
				}
				//集中器号、分配表号、读数、上传时间初始化
				meterData.setConcentratorNo(concentratorNo);
				meterData.setSeriousNum(seriousNum);
				meterData.setReadNum(readNum);
				meterData.setReadTime(CalendarUtils.parseStringToDateTime(readTimeStr));
				//背板温度
				meterData.setBackTmperature(new BigDecimal(dataArray[4]).doubleValue());
				//空气温度，前板温度
				meterData.setFontTemperature(new BigDecimal(dataArray[5]).doubleValue());
				//去年热量
				meterData.setLastYearHeat(new BigDecimal(dataArray[6]).doubleValue());
				//1月份热量
				meterData.setOneHeat(new BigDecimal(dataArray[7]).doubleValue());
				//2月份热量
				meterData.setTwoHeat(new BigDecimal(dataArray[8]).doubleValue());
				//3月份热量
				meterData.setThreeHeat(new BigDecimal(dataArray[9]).doubleValue());
				//4月份热量
				meterData.setFourHeat(new BigDecimal(dataArray[10]).doubleValue());
				//5月份热量
				meterData.setFiveHeat(new BigDecimal(dataArray[11]).doubleValue());
				//10月份热量
				meterData.setTenHeat(new BigDecimal(dataArray[12]).doubleValue());
				//11月份热量
				meterData.setElevenHeat(new BigDecimal(dataArray[13]).doubleValue());
				//12月份热量
				meterData.setTwelveHeat(new BigDecimal(dataArray[14]).doubleValue());
				//抄收时间，抄表时间
				meterData.setRecordTime(CalendarUtils.parseStringToDateTime(dataArray[15]));
				return meterData;
			}
		}
		return null;
	}
	
	/**
	 * 读取上传的TXT文档内容
	 * @param dataFile
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public static String readTxtContent(IAssignMeterDataFile dataFile) throws Exception {
		StringBuffer txtContent = new StringBuffer("");
		if(dataFile != null) {
			String savePath = dataFile.getDiskID() + "/" +dataFile.getSaveUrl();
			File parserFile = new File(savePath);
			if(parserFile.exists() && parserFile.isFile()) {
				InputStreamReader isr = new InputStreamReader(new FileInputStream(parserFile));
				BufferedReader br = new BufferedReader(isr);
				String lineTxt = "";
				while((lineTxt = br.readLine()) != null) {
					txtContent.append(lineTxt);
					txtContent.append("<br/>");
				}
				isr.close();
				br.close();
			}
		}
		return txtContent.toString();
	}
	
	/**
	 * 读取上传的TXT文档内容
	 * @param dataFile
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-29
	 */
	public static String readTxtContent(File dataFile) throws Exception {
		StringBuffer txtContent = new StringBuffer("");
		if(dataFile != null) {
			if(dataFile.exists() && dataFile.isFile()) {
				InputStreamReader isr = new InputStreamReader(new FileInputStream(dataFile));
				BufferedReader br = new BufferedReader(isr);
				String lineTxt = "";
				while((lineTxt = br.readLine()) != null) {
					txtContent.append(lineTxt);
					txtContent.append("<br/>");
				}
				isr.close();
				br.close();
			}
		}
		return txtContent.toString();
	}
}
